package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceCode;
import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.mapper.AttributeTemplateMapper;
import cn.tedu.csmall.product.mapper.CategoryAttributeTemplateMapper;
import cn.tedu.csmall.product.mapper.SpuMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeTemplateAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AttributeTemplateUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.AttributeTemplate;

import cn.tedu.csmall.product.pojo.vo.AttributeTemplateListItemVO;
import cn.tedu.csmall.product.pojo.vo.AttributeTemplateStandardVO;
import cn.tedu.csmall.product.service.IAttributeTemplateService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class AttributeTemplateServiceImpl implements IAttributeTemplateService {

    @Autowired
    AttributeTemplateMapper attributeTemplateMapper;
    @Autowired
    AttributeMapper attributeMapper;
    @Autowired
    CategoryAttributeTemplateMapper categoryAttributeTemplateMapper;
    @Autowired
    SpuMapper spuMapper;
    /**
     * 添加属性模板数据
     * @param attributeTemplateAddNewDTO
     */
    @Override
    public void addNew(AttributeTemplateAddNewDTO attributeTemplateAddNewDTO) {
        String name=attributeTemplateAddNewDTO.getName();
        //根据名字查询是否存在同名属性模板
        int countByName = attributeTemplateMapper.countByName(name);
        //如果存在，抛出异常
        if(countByName>0){
            String message="插入失败，属性模板【"+name+"】已存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        log.debug("没有与【{}】同名的属性模板表，准备插入！",name);
        //创建属性模板对象，把VO对象复制到模板对象中
        AttributeTemplate attributeTemplate=new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateAddNewDTO,attributeTemplate);
        //如果不存在调用mapper接口的插入数据方法获取被影响的行数
        int rows = attributeTemplateMapper.insert(attributeTemplate);
        //如果行数不为1，抛出异常
        if(rows!=1){
            String message="插入失败，系统异常，请稍后重试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
        //输出日志，插入成功
        log.debug("【{}】插入成功！",name);
    }

    /**
     * 根据id删除属性模板
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        //根据id获取VO对象
        AttributeTemplateStandardVO attributeTemplateStandardVO = attributeTemplateMapper.getAttributeTemplateStandardVO(id);
        //如果对象为null，抛出异常
        if(attributeTemplateStandardVO==null){
            String message="删除失败，数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //如果数据存在，根据id查找属性表是否存在关联数据
        int countByTemplateId = attributeMapper.countByTemplateId(id);
        //如果存在，抛出异常
        if(countByTemplateId>0){
            String message="删除失败，存在关联的属性！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //如果不存在，根据id查找类别表是否存在关联数据
        int countByCategoryAttributeTemplateId = categoryAttributeTemplateMapper.countByCategoryAttributeTemplateId(id);
        //存在，抛出异常
        if(countByCategoryAttributeTemplateId>0){
            String message="删除失败，存在关联的类别！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //如果不存在，根据id查找spu表是否存在关联数据
        int countByAttributeTemplateId = spuMapper.countByAttributeTemplateId(id);
        //存在，抛出异常
        if(countByAttributeTemplateId>0){
            String message="删除失败，存在关联的spu数据！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        //不存在，调用mapper接口的deleteById方法，获取受影响的行数
        int rows = attributeTemplateMapper.deleteById(id);
        //如果不为1，抛出异常
        if(rows!=1){
            String message="删除失败，系统异常，请稍后重试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        //输出删除成功日志
        log.debug("删除成功！");
    }

    /**
     * 根据id修改属性模板表数据
     * @param id
     * @param attributeTemplateUpdateDTO
     */
    @Override
    public void update(Long id, AttributeTemplateUpdateDTO attributeTemplateUpdateDTO) {
        //根据id获取VO对象
        AttributeTemplateStandardVO queryResult = attributeTemplateMapper.getAttributeTemplateStandardVO(id);
        //如果对象为null，抛出异常
        if(queryResult==null){
            String message="修改失败，数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        //如果存在，创建AttributeTemplate对象，把DTO对象复制进去
        AttributeTemplate attributeTemplate=new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateUpdateDTO,attributeTemplate);
        //给AttributeTemplate对象设置id值
        attributeTemplate.setId(id);
        //调用mapper接口的update方法，获取受影响的行数
        int rows = attributeTemplateMapper.updateById(attributeTemplate);
        //如果行数不为1，抛出异常
        if(rows!=1){
            String message="修改失败，系统异常，请稍后重试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
        //输出日志，修改成功
        log.debug("修改成功！");
    }


    /**
     * 获取属性模板列表
     * @return
     */
    @Override
    public List<AttributeTemplateListItemVO> list() {
        log.debug("开始获取属性模板列表");
        return attributeTemplateMapper.list();
    }
}
